package com.edu.exam.entity.grading;

import com.edu.exam.enums.common.WorkflowStatus;
import com.edu.exam.enums.common.TaskType;
import com.edu.exam.enums.grading.ImportType;
import com.edu.exam.enums.grading.ImportMode;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 批量导入记录实体类
 * 所属模块：B-06 成绩管理模块
 *
 * <p>批量导入记录实体用于记录批量导入操作的历史和结果，包含
 * 导入文件、处理状态、结果统计、错误信息等。确保批量导入过程的可追溯性和可管理性。</p>
 *
 * <p>核心功能：
 * - 导入记录：记录批量导入的完整信息
 * - 状态管理：管理导入过程的各个状态
 * - 结果统计：统计导入成功和失败的数量
 * - 错误记录：记录导入过程中的错误信息
 * - 文件管理：管理导入文件的元信息</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeBatchImport {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 批次ID
     *
     * <p>批量导入的唯一标识符。</p>
     */
    @Column(name = "batch_id", nullable = false, length = 100, unique = true)
    private String batchId;

    /**
     * 文件名称
     *
     * <p>导入文件的原始名称。</p>
     */
    @Column(name = "file_name", nullable = false, length = 255)
    private String fileName;

    /**
     * 文件路径
     *
     * <p>导入文件的存储路径。</p>
     */
    @Column(name = "file_path", length = 500)
    private String filePath;

    /**
     * 导入类型
     *
     * <p>导入文件的类型。映射到ImportType枚举，支持新建、更新、覆盖、追加等导入模式。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "import_type", nullable = false, length = 50)
    private ImportType importType;

    /**
     * 导入状态
     *
     * <p>导入操作的当前状态。
     * 映射到WorkflowStatus枚举。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false, length = 20)
    private WorkflowStatus status = WorkflowStatus.IN_PROGRESS;

    /**
     * 总记录数
     *
     * <p>导入文件中的总记录数。</p>
     */
    @Column(name = "total_count", nullable = false)
    private Integer totalCount = 0;

    /**
     * 成功记录数
     *
     * <p>成功导入的记录数。</p>
     */
    @Column(name = "success_count", nullable = false)
    private Integer successCount = 0;

    /**
     * 失败记录数
     *
     * <p>导入失败的记录数。</p>
     */
    @Column(name = "fail_count", nullable = false)
    private Integer failCount = 0;

    /**
     * 跳过记录数
     *
     * <p>跳过的记录数。</p>
     */
    @Column(name = "skip_count", nullable = false)
    private Integer skipCount = 0;

    /**
     * 重复记录数
     *
     * <p>重复的记录数。</p>
     */
    @Column(name = "duplicate_count", nullable = false)
    private Integer duplicateCount = 0;

    /**
     * 错误消息
     *
     * <p>导入过程中的错误信息汇总。</p>
     */
    @Column(name = "error_messages", columnDefinition = "TEXT")
    private String errorMessages;

    /**
     * 错误详情
     *
     * <p>详细的错误信息，JSON格式存储。</p>
     */
    @Column(name = "error_details", columnDefinition = "LONGTEXT")
    private String errorDetails;

    /**
     * 导入时间
     *
     * <p>导入操作的时间。</p>
     */
    @Column(name = "import_time", nullable = false)
    private LocalDateTime importTime;

    /**
     * 完成时间
     *
     * <p>导入操作完成的时间。</p>
     */
    @Column(name = "completion_time")
    private LocalDateTime completionTime;

    /**
     * 处理耗时
     *
     * <p>导入操作的总耗时（毫秒）。</p>
     */
    @Column(name = "processing_duration_ms")
    private Long processingDurationMs;

    /**
     * 操作员ID
     *
     * <p>执行导入操作的用户ID。</p>
     */
    @Column(name = "operator_id", length = 50)
    private String operatorId;

    /**
     * 课程ID
     *
     * <p>导入数据关联的课程ID。</p>
     */
    @Column(name = "course_id", length = 50)
    private String courseId;

    /**
     * 班级ID
     *
     * <p>导入数据关联的班级ID。</p>
     */
    @Column(name = "class_id", length = 50)
    private String classId;

    /**
     * 文件大小
     *
     * <p>导入文件的字节大小。</p>
     */
    @Column(name = "file_size_bytes")
    private Long fileSizeBytes;

    /**
     * 文件MD5
     *
     * <p>导入文件的MD5校验值。</p>
     */
    @Column(name = "file_md5", length = 32)
    private String fileMd5;

    /**
     * 导入模板
     *
     * <p>使用的导入模板标识。</p>
     */
    @Column(name = "import_template", length = 50)
    private String importTemplate;

    /**
     * 导入配置
     *
     * <p>导入操作的配置参数，JSON格式存储。</p>
     */
    @Column(name = "import_config", columnDefinition = "TEXT")
    private String importConfig;

    /**
     * 验证规则
     *
     * <p>导入数据验证的规则配置。</p>
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    private String validationRules;

    /**
     * 导入模式
     *
     * <p>导入的处理模式。映射到ImportMode枚举，支持同步、异步、批处理、流式等处理模式。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "import_mode", length = 20)
    private ImportMode importMode = ImportMode.SYNC;

    /**
     * 是否允许重复
     *
     * <p>是否允许导入重复数据。</p>
     */
    @Column(name = "allow_duplicates", nullable = false)
    private Boolean allowDuplicates = false;

    /**
     * 干运行
     *
     * <p>是否为干运行模式（验证但不实际导入）。</p>
     */
    @Column(name = "is_dry_run", nullable = false)
    private Boolean isDryRun = false;

    /**
     * 导入标签
     *
     * <p>JSON格式的导入标签，用于分类和过滤。</p>
     */
    @Column(name = "import_tags", columnDefinition = "TEXT")
    private String importTags;

    /**
     * 导入备注
     *
     * <p>导入操作的备注信息。</p>
     */
    @Column(name = "import_notes", columnDefinition = "TEXT")
    private String importNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 删除用户ID
     */
    @Column(name = "delete_user_id", length = 50)
    private String deleteUserId;

    // ===== 枚举迁移完成 =====
    // importType: 迁移至 ImportType 枚举
    // importMode: 迁移至 ImportMode 枚举
}